#!/usr/bin/python
# -*- coding: utf-8 -*-
# définit l'interface utilisée par les loggers
# on aura des implémentations différentes pour envoyer le résultat sur une boite texte ou sur stdout
# il y aura aussi des méthodes pour indiquer la progression
# variables
# LoggingLevel = niveau minimum de sévérité pour que le message soit affiché
#  sachant que
#   debug     = 0
#   info      = 1
#   warning   = 2
#   error     = 3
#   fatal     = 4
#   nologging = 5
# StepCount = nombre de steps au total
# StepIndex = Step en cours d'exécution
# ImageCount = nombre d'images dans ce step
# ImageIndex = index de l'image en cours de traitement
# ImageName  = nom de l'image en cours de traitement
# ImageThumb = référence un "blob" contenant le thumbnail de l'image en cours
# Ces variables permettront au GUI de mettre à jour les "ProgressBar"
class Logger(object):
    DEBUG, INFO, WARNING, ERROR, FATAL,NOLOGGING= range(6)
    def __init__(self):
        self._loggingLevel = 0 # niveau minimum de logging
        self._stepCount = 0    # nombre de step dans ce run
        self._stepIndex = 0     # index du step courant dans ce run
        self._imageCount = 0    # nombre d'images dans cd step
        self._imageIndex = 0    # index de l'image en cours
        self._imageName = ""    # nom de l'image
        self._imageThumbnail = None
        self._indentation = 0   # niveau d'indentation courant
    
    def Debug(self,message,parameters=None):
        if self._loggingLevel <= self.DEBUG:
            self.OutputMessage("DEBUG", message,parameters)
    
    def Info(self,message,parameters=None):
        if self._loggingLevel <= self.INFO:
            self.OutputMessage("INFO",message,parameters)
        
    def Warning(self,message,parameters=None):
        if self._loggingLevel <= self.WARNING:
            self.OutputMessage("WARNING",message,parameters)
        
    def Error(self,message,parameters=None):
        if self._loggingLevel <= self.ERROR:
            self.OutputMessage("ERROR",message,parameters)
    
    def Fatal(self,message,parameters=None):
        if self._loggingLevel <= self.FATAL:
            self.OutputMessage("FATAL",message,parameters)
     
    def Start(self,stepCount):
        ''' Doit être appelé au début du run
        '''
        self._stepCount = stepCount
        self._stepIndex = 0
        self._indentation = 0
        self.Info("Start of run, number of steps = %d", (self._stepCount,))
      
    def End(self):
        self.Info("End Of Run")
    
    def StartStep(self, imageCount):
        self._imageCount = imageCount
        self._imageIndex = 0
        self._indentation += 1
        self._stepIndex += 1
        self.Info("Start of step %d of %d", (self._stepIndex, self._stepCount))
        
    def EndStep(self):
        self.Info("End  of step %d of %d", (self._stepIndex, self._stepCount))
        self._indentation -= 1
        
        
        
    def StartImage(self, imageName):
        self._imageIndex += 1
        self._indentation += 1
        self._imageName = imageName
        self.Info("Start of image %d of %d", (self._imageIndex, self._imageCount))
    
    def EndImage(self):
        self.Info("End  of image %d of %d", (self._imageIndex, self._imageCount))
        self._imageName = ""
        self._indentation -= 1
   
    def OutputMessage(self,severity,message,parameters):
        if parameters == None :
            print "   " * self._indentation, severity, ":" , message
        else:
            print "   " * self._indentation, severity , ":", (message % parameters)
            
            
        
# méthodes publiques
# Start( StepCount)
#  StartStep(ImageCount)
#   StartImage(imageName)
# 	 SetImageThumnail(imageName, imageThumb=None)
#   EndImage
#  EndStep
# End
# Debug( line, params=None)
#  line: string 
#  params: tuple ( on utilise l'opérateur % à l'intérieur)'
# Info
# Warning
# Error
# Fatal 

# méthodes à redéfinir pour changer la destination
# OutputLine(line)
#  affiche une ligne d'output
# les start et les End pour mettre à jour les progress bars.'